import json
import re

from flask import Blueprint, jsonify, request, current_app
from flasgger import swag_from
from rich import print_json

from .funcSearch import hello
from ..config import Config
from  ..tool.scriptWX.flowScript import add_friend,change_friend_remark,pull_group
from ..tool.soul.preschool import check_time_and_remind, execute_opt, understand_content
import threading

from ..utils import make_response

bp = Blueprint('autoTake', __name__)

@bp.route('/auto/add_friend', methods=['POST'])
@swag_from({
    'parameters': [
        {
            'name': 'friend_info',
            'in': 'body',
            'required': True,
            'schema': {
                'type': 'object',
                'properties': {
                    'WX_ID': {
                        'type': 'string',
                        'example': 'Jing-Wenxing',
                        'description': '要添加的好友的微信号'
                    },
                    'contact_method': {
                        'type': 'string',
                        'example': '手机号',
                        'description': '添加好友的方式（微信号、手机号等）'
                    }
                }
            },
            'description': '好友信息，包括微信号和联系方式(满足其中一个参数 微信号或者电话号码)'
        }
    ],
    'responses': {
        200: {
            'description': '添加好友成功',
            'examples': {
                'application/json': {
                    "code": 200,
                    "msg": "添加好友成功",
                    "data": {
                        "WX_ID": "Jing-Wenxing",
                        "contact_method": "手机号"
                    }
                }
            }
        },
        400: {
            'description': '无效的输入参数',
            'examples': {
                'application/json': {
                    "code": 400,
                    "msg": "无效的输入参数"
                }
            }
        },
        500: {
            'description': '内部服务器错误',
            'examples': {
                'application/json': {
                    "code": 500,
                    "msg": "内部服务器错误"
                }
            }
        }
    }
})
def add_friend_api():
    """添加微信好友"""
    data = request.json
    if not data or ('WX_ID' not in data and 'contact_method' not in data):
        return jsonify({"code": 400, "msg": "无效的输入参数"}), 400
    else:
        if 'contact_method' in data:
            response = add_friend(data['contact_method'])  # 使用重命名后的函数
        else:
            response = add_friend(data['WX_ID'])  # 使用重命名后的函数

        return jsonify({"code": response['code'], "msg": response['msg'], "data": data}), response['code']


@bp.route('/auto/change_friend_remark', methods=['POST'])
@swag_from({
    'parameters': [
        {
            'name': 'friend_info',
            'in': 'body',
            'required': True,
            'schema': {
                'type': 'object',
                'properties': {
                    'WX_NAME': {
                        'type': 'string',
                        'example': 'Jing-Wenxing',
                        'description': '要修改昵称的好友的当前名称 '
                    },
                    'remarkname': {
                        'type': 'string',
                        'example': 'Jing-Wenxing',
                        'description': '需要修改的昵称'
                    },
                }
            },
            'description': '好友信息，包括微信昵称 微信号不一定会搜索到'
        }
    ],
    'responses': {
        200: {
            'description': '修改好友昵称成功',
            'examples': {
                'application/json': {
                    "code": 200,
                    "msg": "修改好友昵称成功",
                    "data": {
                        "WX_NAME": "Jing-Wenxing",
                        "contact_method": "微信昵称"
                    }
                }
            }
        },
        400: {
            'description': '无效的输入参数',
            'examples': {
                'application/json': {
                    "code": 400,
                    "msg": "无效的输入参数"
                }
            }
        },
        500: {
            'description': '内部服务器错误',
            'examples': {
                'application/json': {
                    "code": 500,
                    "msg": "内部服务器错误"
                }
            }
        }
    }
})
def change_friend_remark_api():
    """
    修改微信好友名称
    ---
    tags:
      - 自动化操作
    """
    data = request.json
    if not data or ('WX_NAME' not in data and 'remarkname' not in data):
        return jsonify({"code": 400, "msg": "无效的输入参数"}), 400
    else:
        response = change_friend_remark(data['WX_NAME'],data['remarkname'])  # 使用重命名后的函数

        return jsonify({"code": response['code'], "msg": response['msg'], "data": data}), response['code']


@bp.route('/auto/pull_group', methods=['POST'])
@swag_from({
    'parameters': [
        {
            'name': 'friend_info',
            'in': 'body',
            'required': True,
            'schema': {
                'type': 'object',
                'properties': {
                    'WX_NAMES': {
                        'type': 'array',
                        'example': ['Jing-Wenxing', 'Jing-Wenxing1'],
                        'description': '输入拉群人员昵称（默认包含自己）'
                    },
                    'hello_word': {
                        'type': 'string',
                        'example': '大家好！',
                        'description': '建群招呼语言'
                    },
                }
            },
            'description': '群聊管理 拉群'
        }
    ],
    'responses': {
        200: {
            'description': '拉群成功',
            'examples': {
                'application/json': {
                    "code": 200,
                    "msg": "拉群成功",
                    "data": {
                        "WX_NAMES":["number1","number2"],
                        "hello_word":"大家好！"
                    }
                }
            }
        },
        400: {
            'description': '无效的输入参数',
            'examples': {
                'application/json': {
                    "code": 400,
                    "msg": "无效的输入参数"
                }
            }
        },
        500: {
            'description': '内部服务器错误',
            'examples': {
                'application/json': {
                    "code": 500,
                    "msg": "内部服务器错误"
                }
            }
        }
    }
})
def pull_group_api():
    """
    拉起微信群聊
    ---
    tags:
      - 自动化操作
    """
    data = request.json
    if not data or ('WX_NAMES' not in data and 'hello_word' not in data):
        return jsonify({"code": 400, "msg": "无效的输入参数"}), 400
    else:
        if len(data['WX_NAMES']) >= 2:
            response = pull_group(data['WX_NAMES'],data['hello_word'])
        else:
            return jsonify({"code": 400, "msg": "拉群人数不能少于2人"}), 400
        return jsonify({"code": response['code'], "msg": response['msg'], "data": data}), response['code']


@bp.route('/auto/ai_foot', methods=['POST'])
@swag_from({
    'parameters': [
        {
            'name': 'messages',
            'in': 'body',
            'required': True,
            'schema': {
                'type': 'object',
                'properties': {
                    'model': {
                        'type': 'string',
                        'example': 'ai_control'
                    },
                    'messages': {
                        'type': 'array',
                        'items': {
                            'type': 'object',
                            'example': {"role": "21:54", "content": "打开网易云音乐听歌，不需要退出 你只需要打开后 点击播放列表并播放全部"}
                        }
                    }
                }
            },
            'description': ''
        }
    ],
    'responses': {
        200: {
            'description': 'Successful Response',
            'examples': {
                'application/json': {
                    "results": [
                        {
                            "path": "D:\\Program Files\\AI学习文件1\\TEST\\example.pdf",
                            "snippet": "长沙元元熊餐饮管理有限公司...",
                        }
                    ]
                }
            }
        }
    }
})
def ai_foot_api():
    """
    AIfoot 智能foot
    ---
    tags:
      - 自动化操作
    """
    # 解析请求中的JSON数据
    data = request.get_json()

    # 数据结构验证
    if not data or 'messages' not in data or not data['messages']:
        return make_response(jsonify({"msg": "非法的请求参数或者缺少参数"}), 400)

    content = data['messages'][0].get('content')
    role = data['messages'][0].get('role')

    try:
        db = current_app.db  # 假设你在 Flask 应用的配置中初始化了 MongoDB
        operates_collection = db['operates']  # 定义 operates 集合
        apps_collection = db['apps']  # 定义 apps 集合

        # 获取所有指令集数据
        operates_cursor = operates_collection.find({}, {"_id": 0})  # 返回所有记录，不带 _id 字段
        operates_list = list(operates_cursor)

        if not operates_list:
            return jsonify({"code": 404, "msg": "未找到匹配的指令集"}), 404


        operates = understand_content(content,operates_list)
        operates_ed = operates.replace("```json", '').replace("```", '')
        operates_json = json.loads(operates_ed)
        matched_apps = operates_json['matched_apps']
        print("匹配指令集：",matched_apps,type(matched_apps))

        # 执行指令集，使用多线程进行定时提醒
        base_url = Config.OPERATE_PATH
        target_time = role
        threading.Thread(target=check_time_and_remind, args=(execute_opt, target_time, matched_apps, base_url)).start()

        return jsonify({
            "code": 200,
            "msg": "匹配的应用已执行",
            "matched_apps": operates
        }), 200

    except Exception as e:
        return jsonify({"code": 500, "msg": f"数据库错误: {str(e)}"}), 500



@bp.route('/auto/add_app', methods=['POST'])
@swag_from({
    'parameters': [
        {
            'name': 'messages',
            'in': 'body',
            'required': True,
            'schema': {
                'type': 'object',
                'properties': {
                    'model': {
                        'type': 'string',
                        'example': 'add_app'
                    },
                    'messages': {
                        'type': 'array',
                        'items': {
                            'type': 'object',
                            'properties': {
                                'name_cn': {
                                    'type': 'string',
                                    'example': '网易云音乐',
                                    'description': '应用的中文名称'
                                },
                                'name': {
                                    'type': 'string',
                                    'example': 'netease',
                                    'description': '应用的文件名'
                                },
                                'addresses': {
                                    'type': 'array',
                                    'items': {
                                        'type': 'object',
                                        'properties': {
                                            'key': {
                                                'type': 'string',
                                                'example': '网易云音乐图标',
                                                'description': '操作的描述'
                                            },
                                            'value': {
                                                'type': 'string',
                                                'example': 'netease_icon',
                                                'description': '对应的操作或图标文件名'
                                            }
                                        },
                                        'description': '应用的可执行操作'
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    ],
    'responses': {
        200: {
            'description': '添加应用成功',
            'examples': {
                'application/json': {
                    "code": 200,
                    "msg": "应用已成功添加到数据库",
                    "data": {
                        "name_cn": "网易云音乐",
                        "name": "netease",
                        "addresses": [
                            {"key": "网易云音乐图标", "value": "netease_icon"},
                            {"key": "播放列表", "value": "playlist"},
                            {"key": "播放", "value": "play"},
                            {"key": "退出应用", "value": "exit"}
                        ]
                    }
                }
            }
        },
        400: {
            'description': '无效的输入参数',
            'examples': {
                'application/json': {
                    "code": 400,
                    "msg": "无效的输入参数"
                }
            }
        }
    }
})
def add_app_api():
    """
    添加应用到 MongoDB 数据库
    ---
    tags:
      - 自动化操作
    """
    data = request.json

    # 验证请求数据
    if not data or 'messages' not in data or not data['messages']:
        return jsonify({"code": 400, "msg": "无效的输入参数"}), 400

    # 解析数据 {"name_cn": "网易云音乐", "name": "netease", "addresses": ["netease_icon.png","playlist,png" "play.png"]}
    app_data = data['messages'][0]  # 假设第一个对象包含 app 数据
    name_cn = app_data.get('name_cn')
    name = app_data.get('name')
    addresses = app_data.get('addresses', [])

    # 校验 app_name 和 app_icon
    if not name_cn or not name or not isinstance(addresses, list):
        return jsonify({"code": 400, "msg": "无效的输入参数，缺少 name_cn 或 name 或 addresses"}), 400

    # 准备插入的数据
    app_info = {
        "name_cn": name_cn,
        "name": name,
        "addresses": addresses
    }

    try:
        db = current_app.db  # 假设你在 Flask 应用的配置中初始化了 MongoDB
        apps_collection = db['apps']

        # 检查应用是否已存在，基于 name_cn 或 name 进行查找
        existing_app = apps_collection.find_one({"$or": [{"name_cn": name_cn}, {"name": name}]})

        if existing_app:
            return jsonify({
                "code": 409,
                "msg": f"应用 {name_cn} 或 {name} 已经存在",
                "existing_app": {
                    "name_cn": existing_app['name_cn'],
                    "name": existing_app['name'],
                    "addresses": existing_app['addresses']
                }
            }), 409  # HTTP 状态码 409 表示冲突

        # 插入新应用到数据库
        result = apps_collection.insert_one(app_info)

        # 获取插入的 ObjectId 并转换为字符串
        app_info['_id'] = str(result.inserted_id)

    except Exception as e:
        return jsonify({"code": 500, "msg": f"数据库错误: {str(e)}"}), 500

    return jsonify({
        "code": 200,
        "msg": "应用已成功添加到数据库",
        "data": app_info
    }), 200


